<?php
   
	/**
	* rest.class.php
	* Esta clase contiene las funciones necesarias para obtener y reponder
	* a las peticiones que se hacen a la API.
	* @author Sebastian Lara <slara@grvertice.com>
	* @version 1.0
	* @created 19/DEC/2012
	* @copyright
	*/

	class REST {

		protected $contentType; // tipo de contenido a retornar por la API.
		protected $requestList; // lista de parámetros que se reciben desde el cliente.	
		protected $methodRequest; // metodo por defecto para recibir peticiones desde.
		protected $codeResponse; //código de respuesta por defecto.
		
		/**
		* Función constructora de la clase, inicializa las variables locales para trabajar.
		* @param none
		* @return none
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grverice.com>
		*/
		public function __construct() {
			$this->contentType = "text/xml";
			$this->requestList = array();
			$this->methodRequest = "POST";
			$this->codeResponse = 200;

			$this->captureInputs();
		}
		

		/**
		* Función responsable dar respuesta al cliente implementa usa la API.
		* @param array $response, arreglo de respuesta.
		* @param int $status, código de respuesta.
		* @return none
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grvertice.com>
		*/
		protected function response($response, $status = 200) {
			$this->codeResponse = ($status) ? $status : 200;
			$this->setHeaders();
			echo $response;			
			exit;
		}

		
		/**
		* Función responsable de obtener el mensaje a retornar según el código de respuesta.
		* @param none
		* @return none
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grvertice.com>
		*/
		private function getStatusMessage() {
			$statusList = array(
						100 => 'Continue', 
						101 => 'Switching Protocols', 
						200 => 'OK', 
						201 => 'Created', 
						202 => 'Accepted', 
						203 => 'Non-Authoritative Information',  
						204 => 'No Content',  
						205 => 'Reset Content',  
						206 => 'Partial Content',  
						300 => 'Multiple Choices',  
						301 => 'Moved Permanently : D',  
						302 => 'Found',  
						303 => 'See Other',  
						304 => 'Not Modified',  
						305 => 'Use Proxy',  
						306 => '(Unused)',  
						307 => 'Temporary Redirect',  
						400 => 'Bad Request',  
						401 => 'Unauthorized',  
						402 => 'Payment Required',  
						403 => 'Forbidden',  
						404 => 'Not Found',  
						405 => 'Method Not Allowed',  
						406 => 'Not Acceptable',  
						407 => 'Proxy Authentication Required',  
						408 => 'Request Timeout',  
						409 => 'Conflict',  
						410 => 'Gone',  
						411 => 'Length Required',  
						412 => 'Precondition Failed',  
						413 => 'Request Entity Too Large',  
						414 => 'Request-URI Too Long',  
						415 => 'Unsupported Media Type',  
						416 => 'Requested Range Not Satisfiable',  
						417 => 'Expectation Failed',  
						500 => 'Internal Server Error',  
						501 => 'Not Implemented',  
						502 => 'Bad Gateway',  
						503 => 'Service Unavailable',  
						504 => 'Gateway Timeout',  
						505 => 'HTTP Version Not Supported',
			);
			
			return ($statusList[$this->codeResponse]) ? $statusList[$this->codeResponse] : $statusList[500];
		}

		
		/**
		* Función encargada de obtener el método de petición empleado para acceder a la API, 
		* es decir: 'GET', 'HEAD', 'POST', 'PUT'.
		* @param none
		* @return string REQUEST_METHOD, método de petición
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grvertice.com>
		*/
		public function getRequestMethod() {
			return $_SERVER['REQUEST_METHOD'];
		}
		

		/**
		* Función responsable de capturar los parametros que llegan desde el cliente que
		* implementa la API.
		* @param none
		* @return none
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grvertice.com>
		*/
		private function captureInputs() {
			switch($this->getRequestMethod()){
				case "POST":
					$this->requestList = $this->clearElement($_POST);
					break;
				default:
					$this->response('', 406);
					break;
			}
		}		
		

		/**
		* Función responsable de limpiar un arreglo que llega como parámetro, es decir,
		* se quitan los caracteres maliciosos o innecesarios que vengan en cada posición.
		* @param array $array, representa el array al que se pretende limpiar cada una de 
		* sus posiciones.
		* @return array $arrayClean, es el mismo arreglo que llega como parámetro limpio
		* en cada una de sus posiciones
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grvertice.com>
		*/
		private function clearElement($array) {
			$arrayClean = array ();
			
			if (! empty ($array) && is_array ($array)) {
				foreach ($array as $key => $value){
					$arrayClean[$key] = $this->cleanField($value);
				}
			}

			return $arrayClean;
		}


		/**
		* Esta función "limpia" la cadena que llega como parámetro, es decir, elimina
		* código malicioso y / o caracteres innecesarios que pueda contener la misma.
		* @param string $string, cadena a "limpiar"
		* @return string $stringClean, cadena que llega como parámetro pero "limpia"
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grvertice.com>
		*/
		private function cleanField($string) {
			$stringClean = null;
		
			if (get_magic_quotes_gpc ()) {
				$string = trim (stripslashes ($string));
			}

			$string = strip_tags ($string);
			$stringClean = trim ($string);
		
			return $stringClean;
		}

		
		/**
		* Función responsable de establecer la cabecera de respuesta según el código de
		* respuesta a una peticion y el tipo de contenido
		* @param none
		* @return none
		* @created 19/DEC/2012
		* @author Sebastián Lara <slara@grvertice.com>
		*/
		private function setHeaders() {
			header("HTTP/1.1 ".$this->codeResponse." ".$this->getStatusMessage());
			header("Content-Type:".$this->contentType);
		}
	}